package LeeJS;

public class J06_Conversions {
	
	/*
			
			형 변환 conversions
			float avg = (float) tot /3;
			두 변수가 같은 자료형이라면 대입은 성공적으로 처리
			같은 유형으로 변환하는 것을 동질성 변환이라 함
			
			하지만, 다른 유형으로의 변환은 성공을 보장 못함
			기본자료형 변환에는 확대/축소 변환이 있음
			
			확대 형변환 widening conversion
			int 형에서 long 형으로의 변환처럼 > int = 4바이트, long = 8바이트
			첫번째 유형에 비해 두번째 유형의 크기가 같거나 클때 발생함
			확대변환시 정보 손실의 위험은 발생하지 않음
			단, 정밀도 손실이 간혹 발생할 수 있음
			확대 변환은 암시적으로 일어남
			
			축소 형변환(narrowing conversion)
			long 형에서 int형으로의 변환처럼
			첫번째 유형에 비해 두번째 유형의 크기가 작을때 발생함
			축소 형변환은 확대 형변환과 달리 명시적이여야 함
			괄오안에 변환하려는 유형을 지정 (cast 연산자)
			(float)는 컴파일러에게 float 형으로 변환할 것을 지시함
			정보 손실이 발생할 수 있기 때문에 유의해야 함
			이것은 프로그램의 결함을 이야기함
			
	 */
	
	public static void main(String[] args) {
		
		//동질성 변환(identity conversion)
		
		int a = 90;
		int b = a;
		
		
		//확대 형변환
		
		long c = a;
		
		//축소 형변환
		
		long e = 1234567890123L;
		
		int f = (int) e;
		
		System.out.println(e);
		System.out.println(f);
		
		
		//안전자 우선순위
		
		int g = 1;
		int h = 2;
		int i = 3;
		int j = g + h * i;
		
		System.out.println(j);
		
		//모든 연산자에는 우선순위가 있음
		//가장 높은 우선순위는 (), ++, --
		
		
		int k = 5 ;
		int l = 5 ;
		boolean m = k * 5 == l + 20;
		
		System.out.println(m);
		
		//승격(promotion;
		
		byte n = 5;
		
		/*
				
				byte o = -n
				놀랍게도 오류 발생 
				단항 연산자 -에 의해 변수가 int 형으로 승격함
				문제 해결을 위해 명시적 축소 형변환을 사용하거나 변수를 int 형으로 바꾸면 됨
		
		*/
		
		byte o =(byte) -n;
		int p = -n;
		
		short q = 100;
		short r  = 200;
	//short s = q + r;        오류 발생~~~~~~~
		
		//이항 연산자 +에 의해 q, r 변수가 int 형으로 승격함
		
		short s = (short) (q + r);
		int t = q + r;
		
		/*
				
				주석 comments
				프로그램 코드에 덧붙이는 설명문, 해설
				컴파일러가 소스를 컴파일 할 때 주석은 무시하고 컴파일함
				해당 코드가 제공하는 기능, 용도, 의미를 쉽게 파악하도록 하기 위해
				주석을 사용하는 것은 좋은 습관임
				자바에서는 2가지 주석 유형을 제공 - c, c+과 유사함   */
			//전통적인 주석은 /* 와 */ 사이에 주석을 작성
	/*		주의) 중첩해서 사용하면 안됨!!
				한 줄 주석인 //는 코드 끝에 작성하는 주석
				
				
				연결(join) 연산자 + (concatenate)
				일반적으로 + 연산자는 두 수를 더하는 기능을 가짐
				하지만, 문자나 문자열에 + 연산자를 사용하면 앞의 문자와 뒤의 문자를 연결(합치는)해 줌 
				
		 */
				char u = '가';
				char v = '나';
				
		//	System.out.println( u + v );   승격 때문에 숫자로 출력 
				// 방법은 2가지
				System.out.println( "이름 : " + u + v ); //이렇게 ""를 앞에다가 더해준다
				System.out.print(u);							//이렇게 프린틴에서 ln을 빼서 프린트로 바꿔준다
				System.out.println(v);
				
				
				
				//하지만, 문자에 사용하는 + 연산자로 인한 
				//오버헤드 때문에 StringBuilder 클래스를 주로 사용
		
	}

}
